package lua.compiler.tokens;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import lua.compiler.CompilerException;
import lua.compiler.CtsType;
import lua.compiler.Function;
import lua.compiler.Functions;

import org.antlr.runtime.tree.Tree;

public class DefToken extends GenericToken {
	@Override
	public void parseImpl(Tree tree, Function function) throws CompilerException {
		Logger logger = Logger.getAnonymousLogger();
		int i = 1;
		String name;
		LinkedHashMap<String, CtsType> params = new LinkedHashMap<String, CtsType>();
		
		if (!"Main".equals(function.getName())) {
			throw new CompilerException(
				tree, "nie mozna definiowac funkcji wewnatrz funkcji");
		}
		
		name = tree.getChild(0).getText();

		if (Functions.getFunction(name) != null || "print".equals(name)) {
			logger.warning(tree.getLine() + ": funkcja '" + name + "' jest juz zdefiniowana, nie definiuje jej ponownie");
			return;
		}
		while (i < tree.getChildCount())
		{
			Tree param = tree.getChild(i);
			int type = param.getType();
			String token = Tokens.getToken(type);
			
			// dopoki dostajemy NAME'y, to traktujemy je jako liste parametrow
			if (!token.equals("NAME"))
				break;
			
			params.put(tree.getChild(i).getText(), CtsType.OBJECT);
			i++;
		}

		// dodajemy nowa utworzona funkcje, zeby moc pisac do jej body

		Function newFunction = new Function(name, params);
		Functions.addFunction(newFunction);
		
		// cala reszta drzewa to lista instrukcji
		for (; i < tree.getChildCount(); i++) {
			new StmtToken().parse(tree.getChild(i), newFunction);
		}
	}
}